#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

//定义顺序队列的元素类型
typedef int DataType;

//定义最大存储空间
#define MAX_SIZE 100

//定义顺序队列类型
typedef struct {
    DataType data[MAX_SIZE];
    int front;
    int rear;
}Queue;

//初始化
void initQueue(Queue* queue){
    queue->front = 0;
    queue->rear = 0;
}

//判断队列是否为空
bool isQueueEmpty(Queue* queue){
    return queue->rear == queue->front;
}

//判断队列是否已满
bool isQueueFull(Queue* queue) {
    return queue->front == (queue->rear + 1) % MAX_SIZE;
}

//打印队列的元素
void printQueue(Queue* queue){
    if(isQueueEmpty(queue)){
        printf("Queue is Empty\n");
        return;
    }
    printf("队列元素是（从头到尾）： \n");
    for(int i = queue->front; i != queue->rear; i = (i + 1) % MAX_SIZE){
        printf("%d ", queue->data[i]);
    }
}

//计算队列长度
int lengthQueue(Queue* queue) {
    if(isQueueEmpty(queue)) {
        printf("Queue is Empty\n");
        return 0;
    }
    return queue->rear - queue->front;
}

//入队
void PushQueue(Queue* queue, DataType data) {
    if(isQueueFull(queue)) {
        printf("Queue is full\n");
        return;
    }
    queue->data[queue->rear] = data;
    queue->rear = (queue->rear + 1) % MAX_SIZE;  //取模是为了尾指针不出界
}

//出队
DataType PopQueue(Queue* queue) {
    if(isQueueEmpty(queue)) {
        printf("Queue is Empty\n");
    }
    DataType data = queue->data[queue->front];
    queue->front = (queue->front + 1) % MAX_SIZE;
    return data;
}

int main(void) {
    // 设置控制台为UTF-8编码
    #ifdef _WIN32
    system("chcp 65001 > null");
    #endif

    Queue q;

    //初始化
    initQueue(&q);

    //入队
    PushQueue(&q, 1);
    PushQueue(&q, 2);
    PushQueue(&q, 3);

    //打印元素
    printQueue(&q);

    //计算队列长度
    int length = lengthQueue(&q);
    printf("\nlength: %d\n", length);

    //出队
    DataType data = PopQueue(&q);
    printf("\nPopped data: %d\n", data);

    //出队后结果
    printQueue(&q);
    length = lengthQueue(&q);
    printf("\nlength: %d\n", length);


    return 0;
}